package com.lvy.hczn.front.system.service.impl;

import java.nio.charset.StandardCharsets;
import java.util.List;

import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.lvy.hczn.front.common.constant.Constants;
import com.lvy.hczn.front.common.constant.MqConstants;
import com.lvy.hczn.front.common.core.domain.BaseModel;
import com.lvy.hczn.front.common.exception.UtilException;
import com.lvy.hczn.front.system.domain.business.PackSpec;
import com.lvy.hczn.mq.rocket.ParamInfo;
import com.lvy.hczn.mq.rocket.ProducerUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.lvy.hczn.front.system.mapper.PackSpecMapper;
import com.lvy.hczn.front.system.service.PackSpecService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lvy.hczn.front.common.core.text.Convert;

/**
 * 包装规格信息Service业务层处理
 *
 * @author ruoyi
 * @date 2023-07-09
 */
@Service
@Slf4j
public class PackSpecServiceImpl extends ServiceImpl<PackSpecMapper, PackSpec> implements PackSpecService {

    @Autowired
    private PackSpecMapper packSpecMapper;

    @Autowired
    private ProducerUtil producerUtil;

    /**
     * 查询包装规格信息
     *
     * @param id 包装规格信息主键
     * @return 包装规格信息
     */
    @Override
    public PackSpec selectPackSpecById(String id) {
        return packSpecMapper.selectById(id);
    }

    /**
     * 查询包装规格信息列表
     *
     * @param packSpec 包装规格信息
     * @return 包装规格信息
     */
    @Override
    public List<PackSpec> selectPackSpecList(PackSpec packSpec) {
        return packSpecMapper.selectPackSpecList(packSpec);
    }

    /**
     * 新增包装规格信息
     *
     * @param packSpec 包装规格信息
     * @param sync     是否同步，true：是，false：否
     * @return 结果
     */
    @Override
    public int insertPackSpec(PackSpec packSpec, boolean sync) {
        int num = packSpecMapper.insert(packSpec);
        return sendMsg(packSpec, num, sync);
    }

    /**
     * 修改包装规格信息
     *
     * @param packSpec 包装规格信息
     * @param sync     是否同步，true：是，false：否
     * @return 结果
     */
    @Override
    public int updatePackSpec(PackSpec packSpec, boolean sync) {
        int num = packSpecMapper.updateById(packSpec);
        return sendMsg(packSpec, num, sync);
    }

    /**
     * 信息变更时，发送消息
     *
     * @param packSpec
     * @param num
     * @return int
     * @author yw
     * @date 2023-07-09 13:48:57
     */
    private int sendMsg(PackSpec packSpec, int num, boolean sync) {
        if (!sync) {
            return num;
        }
        ParamInfo<PackSpec> paramInfo = new ParamInfo<>();
        paramInfo.setData(packSpec);
        try {
            producerUtil.sendAsyncMsg(MqConstants.TOPIC_PACK_SPEC, null, JSON.toJSONString(paramInfo).getBytes(StandardCharsets.UTF_8), IdUtil.fastSimpleUUID());
        } catch (Exception e) {
            throw new UtilException("发送信息异常");
        }
        return num;
    }

    /**
     * 批量删除包装规格信息
     *
     * @param ids 需要删除的包装规格信息主键
     * @return 结果
     */
    @Override
    public int deletePackSpecByIds(String ids) {
        String[] idArr = Convert.toStrArray(ids);
        for (String id : idArr) {
            packSpecMapper.deleteById(id);
        }
        return idArr.length;
    }

    /**
     * 删除包装规格信息信息
     *
     * @param id 包装规格信息主键
     * @return 结果
     */
    @Override
    public int deletePackSpecById(String id) {
        return packSpecMapper.deleteById(id);
    }

    /**
     * 修改保存以及发送消息
     *
     * @param packSpec
     * @param sync     是否同步，true：是，false：否
     * @return void
     * @author yw
     * @date 2023-07-09 14:09:50
     */
    @Override
    public void saveOrUpdateInfo(PackSpec packSpec, boolean sync) {
        PackSpec spec = super.getOne(Wrappers.<PackSpec>lambdaQuery().eq(PackSpec::getSourceId, packSpec.getSourceId()).last("limit 1"));
        if (spec != null) {
            packSpec.setId(spec.getId());
            this.updatePackSpec(packSpec, sync);
        } else {
            this.insertPackSpec(packSpec, sync);
        }
    }
}
